package pathfinder

import (
	"gitee.com/night-tc/gobige/msgdef/protomsg"
)

type NavmeshParams struct {
	Start protomsg.Vector3
	End   protomsg.Vector3
}

func PackageFindParams(srcPos, dstPos protomsg.Vector3) NavmeshParams {
	params := NavmeshParams{srcPos, dstPos}
	return params
}

type IPathFinder interface {

	// FindPath 提供外部寻路算法
	//
	// 参数：
	//    params 起点终点
	//    findtype 切换寻路类型
	//
	// 返回值：
	//    path 路点，注意第一个点就是输入的起始点
	//    result 是否寻路成功
	FindPath(stpos, edpos protomsg.Vector3) (path []protomsg.Vector3, result bool)

	// GetNear 获取某个点附近的合法位置
	// 参数：
	//    params 检查点 *linmath.Vector3 类型
	// 返回值：
	//    pos 路点，注意第一个点就是输入的起始点
	//    result 是否能成功
	GetNear(srcPos *protomsg.Vector3) (pos *protomsg.Vector3, result bool)

	// CheckWall 按照100单位步长检查墙
	// 墙的定义点位高程超过500单位
	CheckWall(srcPos, dstPos protomsg.Vector3) (path []protomsg.Vector3, bHaveWall bool)

	// Raycast 射线检测，是否撞到墙了
	// 参数：
	//    srcPos 起点
	//    dstPos 终点
	// 返回值：
	//    pos 如果撞到墙了将会返回墙体位置，否则为空
	//    result 是否碰到墙了，true 碰到墙 false 没有撞到墙
	RaycastEx(srcPos, dstPos protomsg.Vector3) (*protomsg.Vector3, bool)

	//动态阻挡相关
	// 增加可旋转的Box阻挡
	CreateObstacleOBBBox(doorName string, centPos, halfPos protomsg.Vector3, YawDegree int32)
	// 增加圆柱体阻挡
	CreateObstacleCylinder(doorName string, centPos protomsg.Vector3, radius, height int32)
	// 清理掉某个门
	RemoveObstacle(doorName string)
	// 清理全部的门
	RemoveAllObstacle()
	// 更新阻挡信息
	UpdateObstacle()

	MeshCheckRushPath(srcPos, stpos protomsg.Vector3) protomsg.Vector3

	Destroy()
}
